7-4 H M ɮ׶iϧΪ󪺩ʽs

¨ì²{¦b¬°¤î¡A±zÀ³¸Ó¬Ý¹L«Ü¦h¥H GUI ¬°¥Dªº MATLAB À³¥Îµ{¦¡¤F§a¡H¡]¦pªGÁÙ¨S¦³¡A½Ð»°§Ö¸Õ¸Õ xpsound¡Btravel¡Btruss¡Blorenz µ¥«ü¥O¡C¡^¥»¸`±N²³æ¤¶²Ð¦p¦ó¦b«ü¥Oµøµ¡«Ø¥ßÃþ¦üªº GUI ³]­p¡C¡]¥t¤@­Ó GUI ªº³]­p¤èªk¡A«h¬O¨Ï¥Î GUIDE µo®iÀô¹Ò¡A¸Ô¨£¤U¤@³¹¤¶²Ð¡C¡^

MATLAB ªº uicontrol ¬O²£¥Í UI (User Interface) ±±¨îª«¥óªº¥D­n«ü¥O¡A³o¨Ç UI ±±¨îª«¥ó¥]§t¡G

¥H¤U¬O¤@­Ó²£¥Í«ö¶s¡]Push Button¡^ªº³Ì²³æ½d¨Ò¡G

Example 1: 07-´¤§â¦¡¹Ï§Î»PGUI³]­p/uicontrol01.mh = uicontrol; % ²£¥Í«ö¶s set(h, 'String', '½Ð«ö§Ú¡I'); % ¦b«ö¶sªí­±¥[¤J¤å¦r¡u½Ð«ö§Ú¡I¡v cmd = 'fprintf(''¦³¤H«ö§Ú¤@¤U³á¡I\n'');'; % ©w¸q«ö¶s³Q«ö«áªº¤ÏÀ³«ü¥O set(h, 'Callback', cmd); % ³]©w«ö¶sªº¤ÏÀ³«ü¥O

¦b°õ¦æ¤W­z½d¨Ò«á¡AMATLAB ·|²£¥Í¤@­ÓªÅ¥Õµøµ¡¡A¤W­±¦³¤@­Ó«ö¶s¡]¦p¤U¹Ï¡^¡A¨C¦¸¦bÂI¿ï¦¹«ö¶s«á¡AMATLAB ªº«ü¥Oµøµ¡§Y·|¥X²{¡u¦³¤H«ö§Ú¤@¤U³á¡I¡vªº¤å¦r¡A½Ð¿Ë¦Û¸Õ¸Õ¬Ý¡I

¦b¤W¨Ò¤¤¡A¥Ñ©ó UI ±±¨îª«¥ó¬O¹Ï§Îª«¥óªº«Ä¤l¡A¦]¦¹­Y¨S¦³²{¦¨ªº¹Ï§Îµøµ¡¡AMATLAB ·|·s¼W¤@¹Ï§Îµøµ¡¨Ó®e¯Ç UI ±±¨îª«¥ó¡C¦¹¥~¡A©Ò¦³ UI ±±¨îª«¥óªº¡u¤ÏÀ³«ü¥O¡v¡]Callbacks¡A¥ç§Y«ö¤U UI ±±¨îª«¥ó«á¡AMATLAB °õ¦æªº«ü¥O¡^³£¥²¶·¥H¦r¦ê¨Ó©w¸q¡A¦]¦¹­Y¦b¤ÏÀ³°Ê§@¤¤¤S¥X²{¦r¦ê¡]¦p¤W¨Òªº¡u¦³¤H«ö§Ú¤@¤U³á¡I¡v¡^¡A«h¥²¶·¥H¨â­Ó¡u''¡v¡]Double Quote¡^¨Ó®Ø¦í¦r¦ê¡C¡]¦³Ãö¦r¦êªº³B²z¡A¥i¸Ô¨£¥»®Ñ²Ä¤Q³¹¡u¦r¤¸»P¦r¦ê¡v¡C¡^ MATLAB ¤ä´©ªº UI ±±¨îª«¥ó¥i§e²{¦p¤U¡G

Example 2: 07-´¤§â¦¡¹Ï§Î»PGUI³]­p/uicontrol02.mclose all % Ãö³¬©Ò¦³¹Ï§Îµøµ¡ uicontrol('style', 'push', 'position', [200 20 80 30]); uicontrol('style', 'slide', 'position', [200 70 80 30]); uicontrol('style', 'radio', 'position', [200 120 80 30]); uicontrol('style', 'frame', 'position', [200 170 80 30]); uicontrol('style', 'check', 'position', [200 220 80 30]); uicontrol('style', 'edit', 'position', [200 270 80 30]); uicontrol('style', 'list', 'position', [200 320 80 30], 'string', '1|2|3|4'); uicontrol('style', 'popup', 'position', [200 370 80 30], 'string', 'one|two|three');

¦b¤W­z¨Ò¤l¤¤¡Astyle «á­±©Ò±µªº¦r¦ê§Y¥Nªí UI ±±¨îª«¥óªºÃþ§O¡A¦Ó position «á­±©Ò±µªº¦V¶q§Y¥Nªí UI ±±¨îª«¥ó¦b¹Ï§Îµøµ¡ªº¦ì¸m¡A¥H [x, y, width, length] ¬°¨Ò¡A§Y¥Nªí UI ±±¨îª«¥óªº¥ª¤U¨¤¤§®y¼Ð¬° [x, y]¡Aªø«×¬° width¡A°ª«×¬° length ¡]§¡¥H Pixel ¬°³æ¦ì¡^¡C

¥H¤U¤¶²Ð¥t¥~¤@­Ó¸û½ÆÂøªº¨Ò¤l¡A¨äÀɮצWºÙ¬° ui01.m¡A±z¥i¦b MATLAB «ü¥Oµøµ¡¤U¿é¤J¡uui01¡v¡A§Y¥i±o¨ì¤@­Ó¹Ï§Îµøµ¡¤Î¬ÛÃöªº UI ±±¨îª«¥ó¡A¦p¤U¹Ï¡G

Example 3: 07-´¤§â¦¡¹Ï§Î»PGUI³]­p/ui01.m% ²£¥Í·s¹Ï§Îµøµ¡¡A¨ä¥ª¤U¨¤¤§®y¼Ð¬°[30, 30]¡A % ªø«×¬°300¡A°ª«×¬°200¡]§¡¥HPixel¬°³æ¦ì¡^ figure('position', [30 30 300 200]); % ¦b¹Ï§Îµøµ¡¤º²£¥Í¤@­Ó¹Ï¶b¡A¨ä¥ª¤U¨¤¤§®y¼Ð¬°[0.1, 0.2], % ªø«×¬°0.8¡A°ª«×¬°0.8¡]¨Ï¥Î¼Ð·Ç¤Æªº³æ¦ì¡A§Y¹Ï§Îªº¥ª¤U¨¤¬°[0, 0]¡A % ªø«×¤Î°ª«×³£¬O1¡C¡^ axes('position', [0.1 0.2 0.8 0.8]); % µøµ¡¤Wªº²Ä¤@­Ó¹Ï§Î¡A¬°¤T«×ªÅ¶¡ªºpeaks¨ç¼Æ¡C pointNum = 20; [xx, yy, zz] = peaks(pointNum); surf(xx, yy, zz); colormap hsv axis tight % ²Ä¤@­ÓUI±±¨îª«¥ó¡A¥Î¥H±±¨î­I´º®æ½uªºÅã¥Ü¡C h1 = uicontrol('style', 'checkbox', 'string', 'Grid on', ... 'position', [10, 10, 60, 20], 'value', 1); % ²Ä¤G­ÓUI±±¨îª«¥ó¡A¥Î¥H«ü©wX¶b¤ÎY¶bªº®æ¤lÂI¼Æ¥Ø¡C h2 = uicontrol('style', 'edit', 'string', int2str(pointNum), ... 'position', [90, 10, 60, 20]); % ²Ä¤T­ÓUI±±¨îª«¥ó¡A¥Î¥H«ü©wÅã¥Ü¦±­±©Ò¥Î¨ìªº¦â½L¯x°}¡C h3 = uicontrol('style', 'popupmenu', ... 'string', 'hsv|hot|cool', ... 'position', [170, 10, 60, 20]); % ²Ä¤@­ÓUI±±¨îª«¥óªº¤ÏÀ³«ü¥O¬°¡ugrid¡v¡C set(h1, 'callback', 'grid'); % ²Ä¤G­ÓUI±±¨îª«¥óªº¤ÏÀ³«ü¥O¬°¡ucb2¡v¡C set(h2, 'callback', 'cb2'); % ²Ä¤T­ÓUI±±¨îª«¥óªº¤ÏÀ³«ü¥O¬°¡ucb3¡v¡C set(h3, 'callback', 'cb3');

¤W­z½d¨Ò¥i¥H²£¥Í¤@­Ó¹Ï§Îµøµ¡¡A¥]§t¤T­Ó UI ±±¨îª«¥ó¡G

±z¥i¥HÀH·NÂI¿ï©Î§ïÅܳo¨Ç UI ±±¨îª«¥ó¡A¨ÃÆ[¹î¹Ï§Î©M­I´ºªºÅܤơC

¬°¨ÏŪªÌÁA¸Ñ³o­Ó¨Ò¤l¡A§Ú­Ì¦b­ì©lµ{¦¡½X¤¤¥[¤F«Ü¦hµù¸Ñ¡AÅý¦¹½d¨Ò§ó¥[²³æ©öÀ´¡C»Ýª`·Nªº¬O¡A¥»½d¨ÒÁÙ©I¥s¤F¥t¥~¨â­Ó¸}¥»ÀÉ cb2.m ©M cb3.m¡A¨ä¤¤ cb2.m ­t³d³B²z®æ¤lÂIªº­Ó¼Æ¡A¤º®e¦p¤U¡G

07-´¤§â¦¡¹Ï§Î»PGUI³]­p/cb2.m% ¨ú±o²Ä¤G­ÓUI±±¨îª«¥óªº¼Æ­È¡C pointNum = round(str2num(get(h2, 'string'))); % ­Y¼Æ¦r¤Ó¤j©Î¤Ó¤p¡A«h³]©w¬°10¡C if pointNum <= 1 | pointNum > 100, pointNum = 10; set(h2, 'string', int2str(pointNum)); end % ®Ú¾Ú©Ò±oªº¼Æ¦r¡A­«µepeaks¦±­±¡C [xx, yy, zz] = peaks(pointNum); surf(xx, yy, zz); axis tight; % ®Ú¾Ú²Ä¤@­ÓUI±±¨îª«¥ó¡A¨M©w¬O§_­nµe®æ½u¡C if get(h1, 'value')==1, grid on; else grid off; end

¦Ó cb3.m «h­t³d§ïÅܦâ½L¯x°}¡A¤º®e¦p¤U¡G

07-´¤§â¦¡¹Ï§Î»PGUI³]­p/cb3.m% ®Ú¾Ú²Ä¤T­ÓUI±±¨îª«¥ó¨Ó¨M©w¨Ï¥Îªº¦â½L¯x°}¡C switch get(h3, 'value') case 1 colormap(hsv); case 2 colormap(hot); case 3 colormap(cool); otherwise disp('Unknown option'); end

¦b¤W­zªºªºÂ²©ö UI µ{¦¡³]­p½d¨Ò¤¤¡A§Ú­Ì¥i¥Hµoı¦³¨â­Ó¯ÊÂI¡G

  1. »Ý­n¨Ï¥Î¥|­ÓÀɮסAºÞ²z¤£¤è«K¡C
  2. ¨Ï¥ÎªºÅܼƳ£¦b MATLAB °ò¥»¤u§@ªÅ¶¡¤¤¡A®e©ö³y¦¨Åܼƪº¬Û½Ä¤ÎÂл\¡C

¸Ñ¨M¤W­z°ÝÃDªº¤@­Ó²³æªº¤èªk¡A¬O±N©Ò¦³ªºµ{¦¡½X¶°¤¤©ó¤@­Ó¨ç¦¡¤¤¡A¨Ã¥H¤£¦Pªº¿é¤J¦r¦ê¨Ó«ü¥Ü¨ç¼Æ©Ò»Ý°õ¦æªº¥\¯à¡A¦¹ºØ GUI µ{¦¡³]­pªº¤èªk¦b MATLAB ªº¦UºØ Demo µ{¦¡±`³Q¥Î¨ì¡A¯SºÙ¬°¡uSwitchyard Programming¡v¡C¥H¤W¨Ò¨Ó»¡¡A¥H¡uSwitchyard Programming¡v¨Ó²£¥Íªºµ¥®Ä M ÀÉ®×¥iÅã¥Ü¦p¤U¡G

Example 4: 07-´¤§â¦¡¹Ï§Î»PGUI³]­p/ui02.mfunction ui02(action) % ui02: Example of UI programming using "switchyard programming" % Roger Jang, 20040405 if nargin<1, action='initialize'; end switch(action) case 'initialize' % ¹Ï§Îµøµ¡¤ÎUI±±¨îª«¥óªºªì©l¤Æ¡C % ²£¥Í·s¹Ï§Îµøµ¡¡A¨ä¥ª¤U¨¤¤§®y¼Ð¬°[30, 30]¡A % ªø«×¬°300¡A°ª«×¬°200¡]§¡¥HPixel¬°³æ¦ì¡^ figH = figure('position', [30 30 300 200]); % ¦b¹Ï§Îµøµ¡¤º²£¥Í¤@­Ó¹Ï¶b¡A¨ä¥ª¤U¨¤¤§®y¼Ð¬°[0.1, 0.2], % ªø«×¬°0.8¡A°ª«×¬°0.8¡]¨Ï¥Î¼Ð·Ç¤Æªº³æ¦ì¡A§Y¹Ï§Îªº¥ª¤U¨¤¬°[0, 0]¡A % ªø«×¤Î°ª«×³£¬O1¡C¡^ axes('position', [0.1 0.2 0.8 0.8]); % µøµ¡¤Wªº²Ä¤@­Ó¹Ï§Î¡A¬°¤T«×ªÅ¶¡ªºpeaks¨ç¼Æ¡C pointNum = 20; [xx, yy, zz] = peaks(pointNum); surf(xx, yy, zz); colormap hsv axis tight % ²Ä¤@­ÓUI±±¨îª«¥ó¡A¥Î¥H±±¨î­I´º®æ½uªºÅã¥Ü¡C h1 = uicontrol('style', 'checkbox', ... 'tag', 'ui4grid', ... 'string', 'Grid on', ... 'position', [10, 10, 60, 20], 'value', 1); % ²Ä¤G­ÓUI±±¨îª«¥ó¡A¥Î¥H«ü©wX¶b¤ÎY¶bªº®æ¤lÂI¼Æ¥Ø¡C h2 = uicontrol('style', 'edit', ... 'tag', 'ui4pointNum', ... 'string', int2str(pointNum), ... 'position', [90, 10, 60, 20]); % ²Ä¤T­ÓUI±±¨îª«¥ó¡A¥Î¥H«ü©wÅã¥Ü¦±­±©Ò¥Î¨ìªº½Õ¦â½L¡C h3 = uicontrol('style', 'popupmenu', ... 'tag', 'ui4colorMap', ... 'string', 'hsv|hot|cool', ... 'position', [170, 10, 60, 20]); % ²Ä¤@­ÓUI±±¨îª«¥óªº¤ÏÀ³«ü¥O¬°¡ugrid¡v¡C set(h1, 'callback', 'grid'); % ²Ä¤G­ÓUI±±¨îª«¥óªº¤ÏÀ³«ü¥O¬°¡uui02('setPointNum')¡v¡C set(h2, 'callback', 'ui02(''setPointNum'')'); % ²Ä¤T­ÓUI±±¨îª«¥óªº¤ÏÀ³«ü¥O¬°¡uui02('setColorMap')¡v¡C set(h3, 'callback', 'ui02(''setColorMap'')'); case 'setPointNum' % ²Ä¤G­ÓUI±±¨îª«¥óªºcallback¡C % §ä¥X²Ä¤@¤Î²Ä¤G­ÓUI±±¨îª«¥óªº´¤§â¡C h1 = findobj(0, 'tag', 'ui4grid'); h2 = findobj(0, 'tag', 'ui4pointNum'); % ¨ú±o²Ä¤G­ÓUI±±¨îª«¥óªº¼Æ­È¡C pointNum = round(str2num(get(h2, 'string'))); % ­Y¼Æ¦r¤Ó¤j©Î¤Ó¤p¡A«h³]©w¬°10¡C if pointNum <= 1 | pointNum > 100, pointNum = 10; set(h2, 'string', int2str(pointNum)); end % ®Ú¾Ú©Ò±oªº¼Æ¦r¡A­«µepeaks¦±­±¡C [xx, yy, zz] = peaks(pointNum); surf(xx, yy, zz); axis tight; % ®Ú¾Ú²Ä¤@­ÓUI±±¨îª«¥ó¡A¨M©w¬O§_­nµe®æ½u¡C if get(h1, 'value')==1, grid on; else grid off; end case 'setColorMap' % ²Ä¤T­ÓUI±±¨îª«¥óªºcallback¡C % §ä¥X²Ä¤T­ÓUI±±¨îª«¥óªº´¤§â¡C h3 = findobj(0, 'tag', 'ui4colorMap'); % ®Ú¾Ú²Ä¤T­ÓUI±±¨îª«¥ó¨Ó¨M©w¨Ï¥Îªº¦â½L¯x°}¡C switch get(h3, 'value') case 1 colormap(hsv); case 2 colormap(hot); case 3 colormap(cool); otherwise disp('Unknown option'); end otherwise error('Unknown action string!'); end

¤W¨Ò©Ò²£¥Íªº UI ¤¶­±©M¥\¯à¡A©M ui01.m §¹¥þ¤@¼Ë¡A¦ý¥u¦³¥Î¨ì¤@­Ó³æ¤@ÀɮסA°®²b«Ü¦h¡A¦Ó¥B¤£·|µo¥ÍÅܼƬ۽Īº°ÝÃD¡C

¥t¡A¦b¤W¨Ò¤¤¡A§Ú­Ì¬°¤F­n¯à°÷§ä¥X¤T­Ó UI ±±¨îª«¥óªº´¤§â¡A¦]¦¹¯S§O³]©w¥L­Ì­Ó§Oªº¡uTag¡v­È¡A¦]¦¹­Y­n¥Î¨ì³o¨Ç UI ±±¨îª«¥ó¡A¥i¥Î findobj «ü¥O¨Óª½±µ¨Ó§ä¥X¥L­Ìªº´¤§â¡A«D±`¤è«K¡C


MATLABµ{¦¡³]­p¡G¤Jªù½g